#include "head.h"
#define RANDCHARSIZE 8

//这个my hearder 只是为了ERROR_CHECK 用的时候可以删除 用公共头文件实现 ERROR_CHECK就行
//randcharsize是随机产生8位大小字母数字随机组合字符串的长度

//这个函数用来产生随机的8位大小写字母和数字组合的随机字符串 
//通过拼接$6$  以及  下一个$之前的8位 随机字符串 是随机的盐值
//其中$6$是MD5在乌班图18中使用需要的，表明使用了MD5的哈希算法

//文档中的Linux中密码参考 
// zs:$6$EcGQ/umB$KkxG5RZFxRR2TYY0uB5y.0eQDu/ONwCGNI7139Zad.pKo4KDP4k0wTOC1qApemHe6n1opZL3rVnvr.EGFZK3a1:19824:0:99999:7:::

char* getSalt(train_t *train)
{
    const char charset[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    int charset_size = sizeof(charset) - 1;
    //减一是为了去掉 空字符

    static int init = 0;
    if(!init)
    {
        srand(time(NULL));
        init = 1;
        //每次只在程序启动时初始化一次
    }

    //printf("bfoer\n");
   // char *str = (char *)malloc (RANDCHARSIZE + 1);
   // memset(str, 0, strlen(str));
    //给随机生成的八个字符创建空间
   // ERROR_CHECK(str, NULL , "malloc in randsalt");
        char str[RANDCHARSIZE+1] = {0};
    for(int i = 0 ; i < RANDCHARSIZE ; i++)
    
    {
        int key = rand() % charset_size;
        str[i] = charset[key];
    }
    
    //printf("%s\n", str);
    //str[RANDCHARSIZE] = '\0';
    //字符串结尾要以空字符为结尾 否则strcpy等函数会无法识别字符串的结束位置 会引发未定义行为


    //printf("strcpy before\n");
   //这里本来要宏定义 3 1 1 避免魔法数字的 但是加了注释 为了头文件好维护 就不搞了
  // char *salt = (char*) malloc(3 + RANDCHARSIZE + 1 + 1);
  // ERROR_CHECK(salt , NULL , "malloc in randsalt");
   //如果想操作可以自定义 包括RANDCHARSIZE这个宏定义各位也可自便
    
    //printf("%s\n", str);

    //3是 $6$  8见宏定义 1为空字符 1为最后的$
    strcpy(train->buf , "$6$");
    strcat(train->buf , str);
    strcat(train->buf , "$");
    //这里将三个东西都拼接到一起 产生最后可以直接调用的 
    //printf("%s\n", train->buf);
    return train->buf;
}



//下面是可以测试使用的主函数 各位自便
/*int main()
{
    for(int i = 0 ; i < 10 ; i++)
    {
        char *result = getSalt();
        printf("str is %s\n" , result);
        free(result);
        //用完记得free
    }
}*/
